package com.syedu.day14;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * description：
 * java.util.Map,是双列集合,即存放的元素是键值对形式,由key和value所组成
 *
 * Map接口的实现类:
 * HashMap和HashTable
 * HashMap线程非安全,效率相对较高
 *
 * 特点:
 * key无序不可重复,value可以重复
 * 如果添加元素的key相同,则后一次添加会把前一个相同key的元素value覆盖!!!
 *
 * Map的作用: 分门别类管理数据,通过map集合来按照指定的规则进行数据分类,然后供后续操作使用
 *
 * 注意: HashSet其实本质上就是一个特殊的HashMap,特殊在它的value为null
 *
 * @author Administrator
 * @date 2022/3/29 11:10
 */
public class MapDemo {
    public static void main(String[] args) {
        //创建Map集合
        Map<Integer, String> map = new HashMap<>();
        //map集合的添加元素
        map.put(3, "three");
        map.put(1, "one");
        map.put(2, "two");
        map.put(4, "three");
        map.put(1, "one-again");//相同key值会覆盖!!!

        /**常用方法*/
        //1.判断map中是否包含指定的key或者value
        System.out.println(map.containsKey(1));
        System.out.println(map.containsValue("three"));

        //2.根据key获取value
        //注意: 此方法的参数不是下标,map集合没有下标!!!
        String value = map.get(2);
        System.out.println(value);

        //3.根据key删除value(key-value都会删除掉)
        map.remove(4);

        //4.把map中所有的value放入到集合中
        Collection<String> values = map.values();
        System.out.println(values);

        /**遍历*/
        //1.直接打印
        System.out.println(map);

        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

        //2.forEach()
        map.forEach((k, v) -> System.out.println(k + "," + v));

        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

        //3.map专属迭代方式之一: keySet(),把map集合中所有的key放入到Set集合中
        Set<Integer> keys = map.keySet();
        //遍历Set集合得到Map中每一个key
        for (Integer k : keys) {
            //通过key获取value
            String v = map.get(k);
            System.out.println(k + "," + v);
        }

        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

        //4.map专属迭代方式之二: entrySet(),把map集合中所有的key和value的键值对整体封装成Map.Entry对象(内置的类),并且放入到Set集合中
        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        //遍历Set集合,得到每个Entry对象,即键值对整体对象
        for(Map.Entry<Integer, String> entry : entries){
            //通过Entry对象的方法直接获取键值
            Integer k = entry.getKey();
            String v = entry.getValue();
            System.out.println(k + "," + v);
        }
    }
}